import pandas as pd
import chardet

# 文件路径
file_path = r"D:\PycharmProjects\PythonProject\688371.SH.csv"
# 输出文件路径
output_file_path = r"D:\PycharmProjects\PythonProject\peaks_troughs_result.csv"

try:
    # 自动检测文件编码
    with open(file_path, 'rb') as f:
        raw_data = f.read()
        result = chardet.detect(raw_data)
        encoding = result['encoding']
        print(f"检测到文件编码为: {encoding}")

    # 读取 CSV 文件
    df = pd.read_csv(file_path, encoding=encoding, sep=',')

    # 如果只有一列，说明分隔符识别失败，手动处理
    if len(df.columns) == 1:
        header_row = df.columns[0]
        df = pd.read_csv(file_path, encoding=encoding, sep=',', header=None, skiprows=1)
        df.columns = header_row.split(',')

    # 查看实际列名和前几行数据（调试用）
    print("实际列名:", list(df.columns))
    print("数据前几行内容预览：")
    print(df.head().to_dict(orient='records'))

    # 映射实际列名到代码中使用的名称
    column_mapping = {
        '交易日期': 'date',
        '最高价': 'high',
        '最低价': 'low',
        'dif': 'dif'
    }

    # 重命名列
    df = df.rename(columns=column_mapping)

    # 尝试常见日期格式解析
    date_formats = [
        '%Y-%m-%d',
        '%Y/%m/%d',
        '%Y%m%d',
        '%m/%d/%Y',
        '%d-%m-%Y',
        '%Y年%m月%d日'
    ]

    success = False
    for date_format in date_formats:
        try:
            df['date'] = pd.to_datetime(df['date'], format=date_format)
            success = True
            print(f"成功使用格式 {date_format} 解析日期")
            break
        except ValueError:
            continue

    if not success:
        print("警告：无法识别日期格式，使用 pandas 自动解析")
        df['date'] = pd.to_datetime(df['date'], errors='coerce')

    # 确保数据按日期排序
    df = df.sort_values('date')

    # 定义窗口大小（前后各10天）
    window_size = 10

    # 使用滚动窗口查找阶段性高点和低点
    peaks_troughs = []

    # 跳过前后 window_size 天的数据，因为这些位置没有完整的窗口
    for i in range(window_size, len(df) - window_size):
        current_dif = df['dif'].iloc[i]
        window_data = df['dif'].iloc[i - window_size:i + window_size + 1]

        # 判断是否为窗口内的最大值（高点）
        if current_dif == window_data.max():
            peaks_troughs.append({
                'type': 'peak',
                'date': df['date'].iloc[i],
                'high': df['high'].iloc[i],
                'low': df['low'].iloc[i],
                'dif': current_dif
            })

        # 判断是否为窗口内的最小值（低点）
        elif current_dif == window_data.min():
            peaks_troughs.append({
                'type': 'trough',
                'date': df['date'].iloc[i],
                'high': df['high'].iloc[i],
                'low': df['low'].iloc[i],
                'dif': current_dif
            })

    # 将结果转换为 DataFrame 并输出到 CSV 文件
    result_df = pd.DataFrame(peaks_troughs)
    result_df.to_csv(output_file_path, index=False, encoding='utf-8')
    print(f"结果已成功输出到 {output_file_path}")
    print(f"共找到 {len(result_df)} 个阶段性高低点")
    print("结果数据前几行预览：")
    print(result_df.head().to_dict(orient='records'))

except FileNotFoundError:
    print(f"文件 {file_path} 未找到，请检查路径是否正确。")
except KeyError as e:
    print(f"CSV 文件中缺少必要的列：{e}，请检查文件格式或列名映射。")
except Exception as e:
    print(f"处理文件时发生错误：{e}")